Table of contents¶

  • Number of constructed and operated reactors
    • World stats
    • Region stats
    • Subregion stats
    • Country stats
  • Never operated reactors
  • Construction time
In [1]:
import json
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import datetime

import seaborn
seaborn.set_theme()

pd.set_option('future.no_silent_downcasting', True)
In [2]:
with open('regions-m49.json') as f:
    regions = json.load(f)['regions']
    regions = {v: n for n, v in regions.items()}

with open('countries-m49.json') as f:
    countries = json.load(f)['countries']
    country_subregions = {c['name']: regions[c['subRegion']] for c in countries}
    country_regions = {c['name']: regions[c['region']] for c in countries}
In [3]:
country_mapping = {
    'Czech Republic': 'Czechia',
    'Iran': 'Iran (Islamic Republic of)',
    'Russia': 'Russian Federation',
    'South Korea': 'Republic of Korea',
    'Taiwan': 'China',  # UN is an abomination
    'Turkey': 'T\u00fcrkiye',
    'United Kingdom': 'United Kingdom of Great Britain and Northern Ireland',
    'United States': 'United States of America',
}

max_year = 2023
years = range(1954, max_year + 1)
max_date = pd.to_datetime(datetime.date(year = max_year + 1, month = 1, day = 1))

copyright_text = 'CC BY-SA 4.0 Andrey Upadyshev (image) and\nWikipedia, List of commercial nuclear reactors (data)'
copyright_font_size = 10

def format_years_ticks(ax):
    for label in ax.get_xticklabels():
        if label.get_text() in ('1957', '1979', '1986', '2011'):
            label.set_color('red')


def format_number_plants_ticks(ax, ymin, ymax):
    def fmt(val, pos):
        return int(abs(val))
    ax.yaxis.set_major_formatter(fmt)
    ax.set_ylim(-ymin, ymax)
In [4]:
orig_input_df = pd.read_csv('./reactors.csv').convert_dtypes()
for col in ('Begin building', 'Commercial operation', 'Closed'):
    orig_input_df[f'{col} date'] = pd.to_datetime(orig_input_df[col])
    orig_input_df[f'{col}'] = orig_input_df[f'{col} date'].dt.year
In [5]:
input_df = orig_input_df[orig_input_df['Begin building'].notna() & (orig_input_df['Begin building'] <= max_year)].reset_index(drop=True)
input_df.loc[input_df['Commercial operation'] > max_year, 'Commercial operation'] = None
input_df.loc[input_df['Closed'] > max_year, 'Closed'] = None

input_df['SubRegion'] = input_df['Country'].map(lambda x: country_subregions[country_mapping.get(x, x)])
input_df['Region'] = input_df['Country'].map(lambda x: country_regions[country_mapping.get(x, x)])
input_df['Operated closed'] = input_df['Closed'].where(input_df['Commercial operation'].notna(), None)
input_df['Construction time'] = (input_df['Commercial operation date'] - input_df['Begin building date']).dt.total_seconds() / (365.25 * 24 * 60 * 60)
input_df
Out[5]:
Country Plant name Unit No. Type Model Status Capacity (MW) Begin building Commercial operation Closed Begin building date Commercial operation date Closed date SubRegion Region Operated closed Construction time
0 Argentina Atucha 1 PHWR Siemens-KWU Operational 335.0 1968.0 1974.0 NaN 1968-06-01 1974-06-24 NaT Latin America and the Caribbean Americas NaN 6.061602
1 Argentina Atucha 2 PHWR Siemens-KWU Operational 692.0 1981.0 2014.0 NaN 1981-07-14 2014-06-27 NaT Latin America and the Caribbean Americas NaN 32.952772
2 Argentina Embalse 1 PHWR CANDU-6 Operational 600.0 1974.0 1984.0 NaN 1974-04-01 1984-01-20 NaT Latin America and the Caribbean Americas NaN 9.804244
3 Argentina CAREM 1 PWR CAREM25 Under construction 25.0 2014.0 NaN NaN 2014-02-08 NaT NaT Latin America and the Caribbean Americas NaN NaN
4 Armenia Metsamor 1 PWR VVER-440/V-270 Shut down 376.0 1969.0 1977.0 1989.0 1969-07-01 1977-10-06 1989-02-25 Western Asia Asia 1989.0 8.265572
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
746 United States Watts Bar 2 PWR WH 4-Loop (ICECOND) Operational 1164.0 1973.0 2016.0 NaN 1973-09-01 2016-06-04 NaT Northern America Americas NaN 42.757016
747 United States Wolf Creek 1 PWR WH 4-Loop (DRY) Operational 1200.0 1977.0 1985.0 NaN 1977-05-31 1985-09-03 NaT Northern America Americas NaN 8.260096
748 United States Yankee Rowe 1 PWR WH (DRY) Dismantled 167.0 1957.0 1961.0 1991.0 1957-11-01 1961-07-01 1991-10-01 Northern America Americas 1991.0 3.663244
749 United States Zion 1 PWR WH (DRY) Dismantled 1040.0 1968.0 1973.0 1998.0 1968-12-01 1973-12-31 1998-02-13 Northern America Americas 1998.0 5.081451
750 United States Zion 2 PWR WH (DRY) Dismantled 1040.0 1968.0 1974.0 1998.0 1968-12-01 1974-09-17 1998-02-13 Northern America Americas 1998.0 5.793292

751 rows × 17 columns

In [6]:
total_constructed_by_subregion = input_df.groupby(['SubRegion', 'Region'])[['Begin building', 'Commercial operation', 'Closed']].count().reset_index().sort_values('Begin building', ascending=False).reset_index(drop=True)
total_constructed_by_subregion
Out[6]:
SubRegion Region Begin building Commercial operation Closed
0 Eastern Asia Asia 181 147 34
1 Northern America Americas 165 159 52
2 Western Europe Europe 125 120 58
3 Eastern Europe Europe 122 94 29
4 Northern Europe Europe 67 64 45
5 Southern Asia Asia 42 31 2
6 Southern Europe Europe 21 15 13
7 Latin America and the Caribbean Americas 11 7 2
8 Western Asia Asia 10 5 1
9 Northern Africa Africa 3 0 0
10 Sub-Saharan Africa Africa 2 2 0
11 Central Asia Asia 1 1 1
12 South-eastern Asia Asia 1 0 1
In [7]:
total_constructed_by_country = input_df.groupby(['Country', 'SubRegion', 'Region'])[['Begin building', 'Commercial operation', 'Closed']].count().reset_index().sort_values('Begin building', ascending=False).reset_index(drop=True)
total_constructed_by_country
Out[7]:
Country SubRegion Region Begin building Commercial operation Closed
0 United States Northern America Americas 140 134 46
1 China Eastern Asia Asia 81 55 0
2 France Western Europe Europe 69 68 12
3 Japan Eastern Asia Asia 62 59 26
4 Russia Eastern Europe Europe 62 47 10
5 United Kingdom Northern Europe Europe 46 44 35
6 Germany Western Europe Europe 39 36 39
7 India Southern Asia Asia 31 23 1
8 South Korea Eastern Asia Asia 30 27 2
9 Canada Northern America Americas 25 25 6
10 Ukraine Eastern Europe Europe 25 19 8
11 Sweden Northern Europe Europe 14 13 8
12 Spain Southern Europe Europe 14 10 7
13 Slovakia Eastern Europe Europe 9 8 3
14 Belgium Western Europe Europe 8 8 3
15 Bulgaria Eastern Europe Europe 8 6 4
16 Taiwan Eastern Asia Asia 8 6 6
17 Pakistan Southern Asia Asia 7 7 1
18 Italy Southern Europe Europe 6 4 6
19 Switzerland Western Europe Europe 6 6 2
20 Czech Republic Eastern Europe Europe 6 6 0
21 Finland Northern Europe Europe 5 5 0
22 Turkey Western Asia Asia 4 0 0
23 United Arab Emirates Western Asia Asia 4 3 0
24 Argentina Latin America and the Caribbean Americas 4 3 0
25 Belarus Eastern Europe Europe 4 2 2
26 Hungary Eastern Europe Europe 4 4 0
27 Brazil Latin America and the Caribbean Americas 3 2 0
28 Egypt Northern Africa Africa 3 0 0
29 Netherlands Western Europe Europe 2 2 1
30 Armenia Western Asia Asia 2 2 1
31 Bangladesh Southern Asia Asia 2 0 0
32 Cuba Latin America and the Caribbean Americas 2 0 2
33 Iran Southern Asia Asia 2 1 0
34 South Africa Sub-Saharan Africa Africa 2 2 0
35 Lithuania Northern Europe Europe 2 2 2
36 Mexico Latin America and the Caribbean Americas 2 2 0
37 Romania Eastern Europe Europe 2 2 0
38 Poland Eastern Europe Europe 2 0 2
39 Philippines South-eastern Asia Asia 1 0 1
40 Slovenia Southern Europe Europe 1 1 0
41 Austria Western Europe Europe 1 0 1
42 Kazakhstan Central Asia Asia 1 1 1

Number of constructed and operated reactors¶

World stats¶

In [8]:
num_building_started = input_df.groupby(['Begin building'])['Begin building'].count()
num_connected = input_df.groupby(['Commercial operation'])['Commercial operation'].count()
num_closed = input_df.groupby(['Closed'])['Closed'].count()
num_operated_closed = input_df.groupby(['Operated closed'])['Operated closed'].count()

max_building_started = num_building_started.max()
max_num_closed = num_closed.max()
ymax = (max_building_started + 4) // 5 * 5
ymin = (max_num_closed + 4) // 5 * 5

combined = pd.concat([
        num_building_started,
        num_connected,
        num_closed,
        num_operated_closed,
    ], axis=1)

combined = combined.reindex(years, fill_value=0)

combined['Commercial operation tot'] = combined['Commercial operation'].fillna(0).cumsum()
combined['Operated closed tot'] = combined['Operated closed'].fillna(0).cumsum()
combined['In operation'] = combined['Commercial operation tot'] - combined['Operated closed tot']

fig, ax = plt.subplots(2, 1, figsize=(11, 10))

ax1, ax2 = ax

combined['Begin building'].plot.bar(ax=ax1, label='Construction started')
(-combined['Closed']).plot.bar(ax=ax1, color='red', label='Closed')

title = 'World'
print(f'{title}:')
ax1.set_title(title)
ax1.set_xlabel(None)
format_years_ticks(ax1)
format_number_plants_ticks(ax1, ymin, ymax)
ax1.text(0, -ymin, copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
ax1.legend()

combined['In operation'].plot.bar(ax=ax2, label='Number in operation')
combined['Commercial operation'].plot.bar(ax=ax2, color='black', label='Operation started')
format_years_ticks(ax2)
#ax2.text(0, ax2.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
ax2.legend()

fig.tight_layout()
plt.show()
World:
No description has been provided for this image

Region stats¶

In [9]:
total_constructed_by_region = input_df.groupby(['Region'])[['Begin building', 'Commercial operation', 'Closed']].count().reset_index().sort_values('Begin building', ascending=False).reset_index(drop=True)

num_building_started = input_df.groupby(['Region', 'Begin building'])['Begin building'].count()
num_connected = input_df.groupby(['Region', 'Commercial operation'])['Commercial operation'].count()
num_closed = input_df.groupby(['Region', 'Closed'])['Closed'].count()
num_operated_closed = input_df.groupby(['Region', 'Operated closed'])['Operated closed'].count()

#top_regions = total_constructed_by_region[total_constructed_by_region['Begin building'] > 10]['Region'].to_list()
top_regions = total_constructed_by_region['Region'].to_list()

regions = sorted(c for c in input_df['Region'].unique() if c in num_building_started)

max_building_started = num_building_started.max()
max_num_closed = num_closed.max()
ymax = (max_building_started + 4) // 5 * 5
ymin = (max_num_closed + 4) // 5 * 5
tot_ymax_regions = 250  # TODO: calculate from data


for c in top_regions:
    combined = pd.concat([
        num_building_started[c],
        num_connected[c] if c in num_connected else pd.DataFrame(columns=['Commercial operation']),
        num_closed[c] if c in num_closed else pd.DataFrame(columns=['Closed']),
        num_operated_closed[c] if c in num_operated_closed else pd.DataFrame(columns=['Operated closed']),
    ], axis=1)
    
    combined = combined.reindex(years, fill_value=0)

    combined['Commercial operation tot'] = combined['Commercial operation'].fillna(0).cumsum()
    combined['Operated closed tot'] = combined['Operated closed'].fillna(0).cumsum()
    combined['In operation'] = combined['Commercial operation tot'] - combined['Operated closed tot']

    fig, ax = plt.subplots(2, 1, figsize=(11, 10))

    ax1, ax2 = ax

    combined['Begin building'].plot.bar(ax=ax1, label='Construction started')
    (-combined['Closed']).plot.bar(ax=ax1, color='red', label='Closed')

    title = f'{c} (UN M49)'
    print(f'{title}:')
    ax1.set_title(title)
    ax1.set_xlabel(None)
    format_years_ticks(ax1)
    format_number_plants_ticks(ax1, ymin, ymax)
    ax1.text(0, -ymin, copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
    ax1.legend()

    combined['In operation'].plot.bar(ax=ax2, label='Number in operation')
    combined['Commercial operation'].plot.bar(ax=ax2, color='black', label='Operation started')
    format_years_ticks(ax2)
    ax2.set_ylim(0, tot_ymax_regions)
    #ax2.text(0, ax2.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
    ax2.legend()


    fig.tight_layout()
    plt.show()
Europe (UN M49):
No description has been provided for this image
Asia (UN M49):
No description has been provided for this image
Americas (UN M49):
No description has been provided for this image
Africa (UN M49):
No description has been provided for this image
In [10]:
europe_df = input_df[(input_df['Region'] == 'Europe') & (input_df['SubRegion'] != 'Eastern Europe') & (input_df['SubRegion'] != 'Lithuania')]
num_building_started = europe_df.groupby(['Begin building'])['Begin building'].count()
num_connected = europe_df.groupby(['Commercial operation'])['Commercial operation'].count()
num_closed = europe_df.groupby(['Closed'])['Closed'].count()
num_operated_closed = europe_df.groupby(['Operated closed'])['Operated closed'].count()

max_building_started = num_building_started.max()
max_num_closed = num_closed.max()
ymax = (max_building_started + 4) // 5 * 5
ymin = (max_num_closed + 4) // 5 * 5

combined = pd.concat([
        num_building_started,
        num_connected,
        num_closed,
        num_operated_closed,
    ], axis=1)

combined = combined.reindex(years, fill_value=0)

combined['Commercial operation tot'] = combined['Commercial operation'].fillna(0).cumsum()
combined['Operated closed tot'] = combined['Operated closed'].fillna(0).cumsum()
combined['In operation'] = combined['Commercial operation tot'] - combined['Operated closed tot']

fig, ax = plt.subplots(2, 1, figsize=(11, 10))

ax1, ax2 = ax

combined['Begin building'].plot.bar(ax=ax1, label='Construction started')
(-combined['Closed']).plot.bar(ax=ax1, color='red', label='Closed')

title = 'Europe excluding Eastern Europe and ex-USSR countries'
print(f'{title}:')
ax1.set_title(title)
ax1.set_xlabel(None)
format_years_ticks(ax1)
format_number_plants_ticks(ax1, ymin, ymax)
ax1.text(0, -ymin, copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
ax1.legend()

combined['In operation'].plot.bar(ax=ax2, label='Number in operation')
combined['Commercial operation'].plot.bar(ax=ax2, color='black', label='Operation started')
format_years_ticks(ax2)
ax2.set_ylim(0, tot_ymax_regions)
#ax2.text(0, ax2.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
ax2.legend()

fig.tight_layout()
plt.show()
Europe excluding Eastern Europe and ex-USSR countries:
No description has been provided for this image

Subregion stats¶

In [11]:
num_building_started = input_df.groupby(['SubRegion', 'Begin building'])['Begin building'].count()
num_connected = input_df.groupby(['SubRegion', 'Commercial operation'])['Commercial operation'].count()
num_closed = input_df.groupby(['SubRegion', 'Closed'])['Closed'].count()
num_operated_closed = input_df.groupby(['SubRegion', 'Operated closed'])['Operated closed'].count()

sub_regions = sorted(c for c in input_df['SubRegion'].unique() if c in num_building_started)
#top_regions = total_constructed_by_subregion[total_constructed_by_subregion['Begin building'] > 10]['SubRegion'].to_list()
top_regions = total_constructed_by_subregion['SubRegion'].to_list()

max_building_started = num_building_started.max()
max_num_closed = num_closed.max()
ymax = (max_building_started + 4) // 5 * 5
ymin = (max_num_closed + 4) // 5 * 5


for c in top_regions:
    combined = pd.concat([
        num_building_started[c],
        num_connected[c] if c in num_connected else pd.DataFrame(columns=['Commercial operation']),
        num_closed[c] if c in num_closed else pd.DataFrame(columns=['Closed']),
        num_operated_closed[c] if c in num_operated_closed else pd.DataFrame(columns=['Operated closed']),
    ], axis=1)
    
    combined = combined.reindex(years, fill_value=0)

    combined['Commercial operation tot'] = combined['Commercial operation'].fillna(0).cumsum()
    combined['Operated closed tot'] = combined['Operated closed'].fillna(0).cumsum()
    combined['In operation'] = combined['Commercial operation tot'] - combined['Operated closed tot']

    fig, ax = plt.subplots(2, 1, figsize=(11, 10))

    ax1, ax2 = ax

    combined['Begin building'].plot.bar(ax=ax1, label='Construction started')
    (-combined['Closed']).plot.bar(ax=ax1, color='red', label='Closed')

    title = f'{c} (UN M49)'
    print(f'{title}:')
    ax1.set_title(title)
    ax1.set_xlabel(None)
    format_years_ticks(ax1)
    format_number_plants_ticks(ax1, ymin, ymax)
    ax1.text(0, -ymin, copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
    ax1.legend()

    combined['In operation'].plot.bar(ax=ax2, label='Number in operation')
    combined['Commercial operation'].plot.bar(ax=ax2, color='black', label='Operation started')
    format_years_ticks(ax2)
    ax2.set_ylim(0, tot_ymax_regions)
    #ax2.text(0, ax2.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
    ax2.legend()


    fig.tight_layout()
    plt.show()
Eastern Asia (UN M49):
No description has been provided for this image
Northern America (UN M49):
No description has been provided for this image
Western Europe (UN M49):
No description has been provided for this image
Eastern Europe (UN M49):
No description has been provided for this image
Northern Europe (UN M49):
No description has been provided for this image
Southern Asia (UN M49):
No description has been provided for this image
Southern Europe (UN M49):
No description has been provided for this image
Latin America and the Caribbean (UN M49):
No description has been provided for this image
Western Asia (UN M49):
No description has been provided for this image
Northern Africa (UN M49):
No description has been provided for this image
Sub-Saharan Africa (UN M49):
No description has been provided for this image
Central Asia (UN M49):
No description has been provided for this image
South-eastern Asia (UN M49):
No description has been provided for this image

Country stats¶

In [12]:
num_building_started = input_df.groupby(['Country', 'Begin building'])['Begin building'].count()
num_connected = input_df.groupby(['Country', 'Commercial operation'])['Commercial operation'].count()
num_closed = input_df.groupby(['Country', 'Closed'])['Closed'].count()
num_operated_closed = input_df.groupby(['Country', 'Operated closed'])['Operated closed'].count()

countries = sorted(c for c in input_df['Country'].unique() if c in num_building_started)
#top_countries = total_constructed_by_country[total_constructed_by_country['Begin building'] >= 10]['Country'].to_list()
top_countries = total_constructed_by_country['Country'].to_list()

max_building_started = num_building_started.max()
max_num_closed = num_closed.max()
ymax = (max_building_started + 4) // 5 * 5
ymin = (max_num_closed + 4) // 5 * 5
tot_ymax = 120  # TODO: calculate from data


for c in top_countries:
    combined = pd.concat([
        num_building_started[c],
        num_connected[c] if c in num_connected else pd.DataFrame(columns=['Commercial operation']),
        num_closed[c] if c in num_closed else pd.DataFrame(columns=['Closed']),
        num_operated_closed[c] if c in num_operated_closed else pd.DataFrame(columns=['Operated closed']),
    ], axis=1)
    
    combined = combined.reindex(years, fill_value=0)

    combined['Commercial operation tot'] = combined['Commercial operation'].fillna(0).cumsum()
    combined['Operated closed tot'] = combined['Operated closed'].fillna(0).cumsum()
    combined['In operation'] = combined['Commercial operation tot'] - combined['Operated closed tot']

    fig, ax = plt.subplots(2, 1, figsize=(11, 10))

    ax1, ax2 = ax

    combined['Begin building'].plot.bar(ax=ax1, label='Construction started')
    (-combined['Closed']).plot.bar(ax=ax1, color='red', label='Closed')

    title = c
    print(f'{title}:')
    ax1.set_title(title)
    ax1.set_xlabel(None)
    format_years_ticks(ax1)
    format_number_plants_ticks(ax1, ymin, ymax)
    ax1.text(0, -ymin, copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
    ax1.legend()

    combined['In operation'].plot.bar(ax=ax2, label='Number in operation')
    combined['Commercial operation'].plot.bar(ax=ax2, color='black', label='Operation started')
    format_years_ticks(ax2)
    ax2.set_ylim(0, tot_ymax)
    #ax2.text(0, ax2.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
    ax2.legend()

    fig.tight_layout()
    plt.show()
United States:
No description has been provided for this image
China:
No description has been provided for this image
France:
No description has been provided for this image
Japan:
No description has been provided for this image
Russia:
No description has been provided for this image
United Kingdom:
No description has been provided for this image
Germany:
No description has been provided for this image
India:
No description has been provided for this image
South Korea:
No description has been provided for this image
Canada:
No description has been provided for this image
Ukraine:
No description has been provided for this image
Sweden:
No description has been provided for this image
Spain:
No description has been provided for this image
Slovakia:
No description has been provided for this image
Belgium:
No description has been provided for this image
Bulgaria:
No description has been provided for this image
Taiwan:
No description has been provided for this image
Pakistan:
No description has been provided for this image
Italy:
No description has been provided for this image
Switzerland:
No description has been provided for this image
Czech Republic:
No description has been provided for this image
Finland:
No description has been provided for this image
Turkey:
No description has been provided for this image
United Arab Emirates:
No description has been provided for this image
Argentina:
No description has been provided for this image
Belarus:
No description has been provided for this image
Hungary:
No description has been provided for this image
Brazil:
No description has been provided for this image
Egypt:
No description has been provided for this image
Netherlands:
No description has been provided for this image
Armenia:
No description has been provided for this image
Bangladesh:
No description has been provided for this image
Cuba:
No description has been provided for this image
Iran:
No description has been provided for this image
South Africa:
No description has been provided for this image
Lithuania:
No description has been provided for this image
Mexico:
No description has been provided for this image
Romania:
No description has been provided for this image
Poland:
No description has been provided for this image
Philippines:
No description has been provided for this image
Slovenia:
No description has been provided for this image
Austria:
No description has been provided for this image
Kazakhstan:
No description has been provided for this image

Never opened reactors¶

In [13]:
# Never opened
never_opened_df = input_df[input_df['Commercial operation'].isna() & input_df['Begin building'].notna() & input_df['Closed'].notna()].sort_values('Closed')

num_building_started = never_opened_df.groupby(['Begin building'])['Begin building'].count()
num_closed = never_opened_df.groupby(['Closed'])['Closed'].count()

combined = pd.concat([
        num_building_started,
        num_closed,
    ], axis=1)

combined = combined.reindex(years, fill_value=0)

fig, ax = plt.subplots(figsize=(11, 5))

combined['Begin building'].plot.bar(ax=ax, label='Construction started')
(-combined['Closed']).plot.bar(ax=ax, color='red', label='Closed')

title = 'Never operated reactors'
print(f'{title}:')
ax.set_title(title)
ax.set_xlabel(None)
format_years_ticks(ax)
ax.yaxis.set_major_formatter(lambda val, pos: int(val))
ax.text(0, ax.get_ylim()[0], copyright_text, fontsize=copyright_font_size, verticalalignment='bottom')
ax.legend()

fig.tight_layout()
plt.show()
Never operated reactors:
No description has been provided for this image
In [14]:
never_opened_df.groupby(['Country', 'Closed'])['Closed'].count().sort_values(ascending=False)
Out[14]:
Country        Closed
Spain          1984.0    4
United States  1984.0    3
Belarus        1987.0    2
Cuba           1992.0    2
Germany        1990.0    2
Italy          1988.0    2
Poland         1990.0    2
Taiwan         2014.0    2
Ukraine        1987.0    2
               1990.0    2
United States  1983.0    2
Austria        1978.0    1
Germany        1985.0    1
Philippines    1986.0    1
Sweden         1970.0    1
Name: Closed, dtype: int64
In [15]:
never_opened_df.groupby(['Country', 'Begin building'])['Begin building'].count().sort_values(ascending=False)
Out[15]:
Country        Begin building
United States  1975.0            4
Poland         1982.0            2
Ukraine        1988.0            2
               1984.0            2
Germany        1983.0            2
Italy          1982.0            2
Taiwan         1999.0            2
Belarus        1983.0            2
Spain          1972.0            2
               1975.0            2
Sweden         1965.0            1
Austria        1972.0            1
Philippines    1976.0            1
Germany        1972.0            1
Cuba           1985.0            1
               1983.0            1
United States  1977.0            1
Name: Begin building, dtype: int64

Construction time¶

In [16]:
construction_time = input_df.groupby(['Begin building'])['Construction time'].agg(['min', 'median', 'max']).reindex(years, fill_value=0)

fig, ax = plt.subplots(figsize=(11, 5))

construction_time.plot.bar(ax=ax, width=0.8)

title = 'Years of construction time by the year when construction started - World'
print(f'{title}:')
ax.set_title(title)
ax.set_xlabel(None)
format_years_ticks(ax)
ax.yaxis.set_major_formatter(lambda val, pos: int(val))
ax.yaxis.set_major_locator(ticker.MultipleLocator(5))
ax.text(0, ax.get_ylim()[1] - 0.1, copyright_text, fontsize=copyright_font_size, verticalalignment='top')
ax.legend()

fig.tight_layout()
plt.show()
Years of construction time by the year when construction started - World:
No description has been provided for this image
In [17]:
top_countries = total_constructed_by_country['Country'].to_list()
construction_time = input_df.groupby(['Country', 'Begin building'])['Construction time'].agg(['min', 'median', 'max'])
ymax = construction_time.max(axis=None) + 1

for c in top_countries:
    df = construction_time[construction_time.index.get_level_values(0) == c].droplevel(0).reindex(years, fill_value=0)
    
    fig, ax = plt.subplots(figsize=(11, 5))

    df.plot.bar(ax=ax, width=0.8)

    title = f'Years of construction time by the year when construction started - {c}'
    print(title)
    ax.set_title(title)
    ax.set_xlabel(None)
    format_years_ticks(ax)

    ax.yaxis.set_major_formatter(lambda val, pos: int(abs(val)))
    ax.yaxis.set_major_locator(ticker.MultipleLocator(5))

    ax.set_ylim(0, ymax)
    ax.text(0, ax.get_ylim()[1], copyright_text, fontsize=copyright_font_size, verticalalignment='top')
    ax.legend()

    fig.tight_layout()
    plt.show()
Years of construction time by the year when construction started - United States
No description has been provided for this image
Years of construction time by the year when construction started - China
No description has been provided for this image
Years of construction time by the year when construction started - France
No description has been provided for this image
Years of construction time by the year when construction started - Japan
No description has been provided for this image
Years of construction time by the year when construction started - Russia
No description has been provided for this image
Years of construction time by the year when construction started - United Kingdom
No description has been provided for this image
Years of construction time by the year when construction started - Germany
No description has been provided for this image
Years of construction time by the year when construction started - India
No description has been provided for this image
Years of construction time by the year when construction started - South Korea
No description has been provided for this image
Years of construction time by the year when construction started - Canada
No description has been provided for this image
Years of construction time by the year when construction started - Ukraine
No description has been provided for this image
Years of construction time by the year when construction started - Sweden
No description has been provided for this image
Years of construction time by the year when construction started - Spain
No description has been provided for this image
Years of construction time by the year when construction started - Slovakia
No description has been provided for this image
Years of construction time by the year when construction started - Belgium
No description has been provided for this image
Years of construction time by the year when construction started - Bulgaria
No description has been provided for this image
Years of construction time by the year when construction started - Taiwan
No description has been provided for this image
Years of construction time by the year when construction started - Pakistan
No description has been provided for this image
Years of construction time by the year when construction started - Italy
No description has been provided for this image
Years of construction time by the year when construction started - Switzerland
No description has been provided for this image
Years of construction time by the year when construction started - Czech Republic
No description has been provided for this image
Years of construction time by the year when construction started - Finland
No description has been provided for this image
Years of construction time by the year when construction started - Turkey
No description has been provided for this image
Years of construction time by the year when construction started - United Arab Emirates
No description has been provided for this image
Years of construction time by the year when construction started - Argentina
No description has been provided for this image
Years of construction time by the year when construction started - Belarus
No description has been provided for this image
Years of construction time by the year when construction started - Hungary
No description has been provided for this image
Years of construction time by the year when construction started - Brazil
No description has been provided for this image
Years of construction time by the year when construction started - Egypt
No description has been provided for this image
Years of construction time by the year when construction started - Netherlands
No description has been provided for this image
Years of construction time by the year when construction started - Armenia
No description has been provided for this image
Years of construction time by the year when construction started - Bangladesh
No description has been provided for this image
Years of construction time by the year when construction started - Cuba
No description has been provided for this image
Years of construction time by the year when construction started - Iran
No description has been provided for this image
Years of construction time by the year when construction started - South Africa
No description has been provided for this image
Years of construction time by the year when construction started - Lithuania
No description has been provided for this image
Years of construction time by the year when construction started - Mexico
No description has been provided for this image
Years of construction time by the year when construction started - Romania
No description has been provided for this image
Years of construction time by the year when construction started - Poland
No description has been provided for this image
Years of construction time by the year when construction started - Philippines
No description has been provided for this image
Years of construction time by the year when construction started - Slovenia
No description has been provided for this image
Years of construction time by the year when construction started - Austria
No description has been provided for this image
Years of construction time by the year when construction started - Kazakhstan
No description has been provided for this image